查看原文
其他

渗透测试的WINDOWS NTFS技巧集合(一)

lipss 看雪学院 2019-05-26


由于篇幅过长,故将《渗透测试的WINDOWS NTFS技巧集合》分为两个部分发,今日为第一部分,内有技巧1-4。明日将发布第二个部分,内有技巧5、技巧6。


这篇文章是来自SEC Consult Vulnerability Lab的ReneFreingruber (@ReneFreingruber),分享了过去几年从各种博客文章中收集的或者是他自己发现的文件系统技巧,这些技巧不可以直接被利用。但是它们会在特殊情况下间接地产生可以被攻击者利用的漏洞。

 

请注意,这篇文章只说明有关于如何利用这些问题以及影响的信息(没有关于Windows API的技术底层细节),因为这样会超出本篇文章的技术范围。

 

第一个文件系统技巧(技巧1 - CVE-2018-1036)被微软修补了,其他技巧还有没有安全补丁。

 

技巧1:创建没有权限的文件夹(CVE-2018-1036/NTFS EOP)


在Windows上,可以为文件夹分配“特殊权限”,例如允许用户在文件夹中创建文件但不允许创建文件夹的权限。

 

此类文件夹的一个示例是C:\Windows\Tasks\,用户可以在其中创建文件,但不允许创建文件夹:

 

 图1:Windows10,Win7界面不一样。示例为Windows10

 

而管理员或程序可能会配置这样的权限,并假设用户不允许在其中创建文件夹。

 

这个ACL策略可以在用户创建文件时被绕过。如果在文件名的末尾添加“::$INDEX_ALLOCATION”将创建一个文件夹而不是一个文件。Windows当前不包含对该类情况的检查。

 

 图2:创建test文件夹

 

如上图所示,已成功创建了一个文件夹,用户可以在这个文件夹中创建任意的文件或文件夹(如果管理员/程序认为缺少权限而无法执行创建文件夹的操作,这个技巧可能会导致特权提升 )。

 

附注:如果应用程序只允许删除文件,:: $ INDEX_ALLOCATION技巧也可用于删除文件夹。

 

译者注:使用以下命令即可删除文件夹。

rd test::$INDEX_ALLOCATION


技巧2:使用供选数据流绕过路径限制


你可能想知道为什么上面的方法有效。

 

<文件名>:<数据流名称>:<类型>

 

如果我们创建一个名为test的文件。它将在内部存储为test.test::$DATA,因为数据流名为空,且$DATA是默认类型。第一个技巧的原理是将数据流类型更改为INDEX_ALLOCATION,而INDEX_ALLOCATION对应于文件夹类型,所以创建了一个文件夹。

 

但是,也可以将数据存储在不同的流中。(这就是所谓的Alternate Data Stream – ADS)。如果我们写的例子是“test.txt”,我们在实际写入的是“test.txt::$DATA”(数据流名称为空)。我们也可以写入“test.txt:foo” 或“test.txt:foo:$DATA”(两者都相同,因为$DATA是默认类型)。


也可以使用不同的流名称用于存储文件的信息。如果你从互联网下载文件(或通过电子邮件接收),Windows系统会通过流名称悄悄地添加区域标识符(如果你想执行会显示出一个附加的警告对话框)例如,如果我们下载“putty.exe”,Windows也会创建“putty.exe:Zone.Identifier:$DATA”。使用dir /r命令可以看到这些流名称:

 

 图3:将zone.identifier放到putty.exe中,然后尝试读取出来。

 

正如我们所看到的,带有数据流的文件是不能通过type命令直接读取的(使用更多的命令就可以了),如果我们使用notepad读取文件,那么可以忽略冒号最末尾的$DATA类型。我们还可以把重要的信息(包括应用程序!)在ADS中存储。例如putty.exe就可以复制到ADS中,然后通过wmic调用(不可以用start直接调用):

 

图4:运行test:Putty.exe

 

附注:本文撰写于2018-03-01,并报告给微软。与此同时,微软的Windows Defender被更新以检测WMIC进程调用。

 

你可能会问为什么有人会这样做?首先,ADS可以用来隐藏数据(dir没有使用/r开关不会显示文件中的ADS;explorer.exe也不会显示ADS;稍后介绍如何能够隐藏dir /r开关的内容…)而ADS还有一个很好的特性——我们可以在文件夹中添加ADS。这样做的前提是在文件夹里拥有“创建文件夹”的权限(而且文件夹名称不能是数字)。这样做可以使文件夹上的ADS看起来像是来自父文件夹的文件!

 

在Windows上一个普通用户无法在C:\Windows创建文件(只有管理员可以写这个文件夹)。因为只有管理员可以创建这些文件,所以应用有可能认为文件在C:\Windows\是可以受信任的。可是普通用户在C:\Windows\Tracing文件夹中是可以创建文件和文件夹的,因此普通用户可以创建一个ADS在这个文件夹中。

 

假设用户写入文件C:\Windows\Tracing:test.dll。如果这个路径现在被传递给一个遍历文件夹的Windows API,这个API将从路径的末尾开始,直到找到第一个“\”。将“\”中剩下的所有内容作为文件夹返回。而C:\Windows\Tracing:test.dll 将返回C:\Windows\作为文件夹。正如前面提到的,一个普通用户不允许使用这个技巧创建文件在Windows文件夹。但是我们可以通过这个方法创建了一个文件,而且是存储在C:\ Windows文件夹内 !

 

这里是不同Windows函数遍历文件夹的输出(我们可以看到它总是C:\ Windows):

 

 图5:遍历文件夹

 

注:上述存储dll可以开始与Windows内置的control.exe应用程序启动,命令为:

 

control.exe C:\Windows\tracing:foobar.dll

 

此行为可用于绕过某些应用程序白名单解决方案,也可以在各种情况下绕过安全检查。例如程序员认为检查文件是否存储在特定的文件文件夹中就足够了并且假设当管理员通过设置ACL后写入这个文件夹。

 

考虑应用程序允许上传数据,上传的数据存储在applicationFolder \ uploadedData \中。而应用程序允许从applicationFolder\启动脚本/应用程序,而不允许从applicationFolder \uploadedData(使用黑名单方法)启动脚本/应用程序。如果用户上传一个名为“:foo.ps1”的文件,系统将创建一个类似于applicationFolder\uploadedData:foo.ps1的ADS。此文件似乎存储在applicationFolder\中,因此绕过安全检查。

 

另一个有趣的事情是ADS可以包含通常文件名禁止使用的“或*符号(必须使用本机Windows API创建这些文件;cmd.exe会过滤这些字符):

 

 图6:特殊符号

 

这本身就可能导致几个问题。(例如,如果文件名以“开头和路径被”包围结尾,正如James Forshaw在他的博客中提到的方法;请参见参考资料部分)。另一个有趣的攻击向量可以是XSS(或命令注入)。假设一个网站在IIS上运行并允许上传文件,并且很容易出现CSRF。上传文件后,将显示包含文件名的成功对话框。如果文件名未被处理,这可能会导致XSS,但是如果文件名不允许包含像<或>之类的符号(因此我们不能用它来执行JavaScript代码)。如果允许ADS文件包含这些符号,那么攻击者可以尝试使用ADS文件名发送上传请求:

 

图7:ADS的XSS利用

 

技巧3:创建无法通过“…”文件夹找到的文件


每个文件夹都包含默认的两个特殊条目,也就是指当前文件夹“.”文件夹和指向父文件夹(父目录)“..”文件夹。在Windows上不能用名称中的点创建文件/文件夹,最有可能防止将解析器与点混淆的攻击。

 

图8:创建...文件夹测试

 

上面的截图显示,不能创建一个“…”或“....”的文件夹。但是可以使用上面提到的:$INDEX_ALLOCATION技巧来绕过:

 

图9:ADS创建....文件夹

 

“…”文件夹是用上面提到的技巧创建的,但是这样的文件夹也可以将名称传递两次来创建,如“…”示例中所示。(mkdir “....\ ....\“ 创建文件夹”....”,但里面还有一个文件夹“….”。仅仅通过mkdir ”....\xyz\“不起作用。)。

 

使用第二个技巧,我们还可以输入这些文件夹,在那里存储文件,甚至从这个位置执行程序:

 

图10:向...文件夹写入文件的方法

 

如图所示,无法仅使用名称进入文件夹(例如:“cd …”或“cd …\”或“cd …\…”不起作用),必须使用“cd …\…\”的语法。进入文件夹之后可以在这个文件夹里创建文件。(有趣的是:如果你在这个文件夹里输入“cd .”,你又会回到这个文件夹,因为路径是混乱的)。

 

此外,也不可能从GUI (explorer.exe)打开这个文件夹。我遇到了两种不同的情况。在某些情况下,双击这样的文件夹没有影响(保持在当前文件夹中,路径保持不变),在其他情况下,我们将保持在文件夹中,但是资源管理器中的路径发生了更改。例如,在“打开”文件夹17次之后(注意路径中的“…” ):

 

图11:...文件夹显示在地址栏的情况

 

可以尝试根据需要随时进入该文件夹 ,可无法在GUI中的文件夹中看到这些文件 。也无法通过在上图中的路径输入字段传递“C:\test\…\…\”来打开文件夹。

 

(附注:如果试图从GUI中删除该文件夹,explorer.exe会崩溃;我们将看到一个对话框,其中Windows正在计算文件夹中的文件以及它所在的位置“很多文件” ;不要在工作系统上试试这个... )

 

通过GUI (explorer.exe)搜索这个文件夹中的文件也不起作用,例如GUI搜索“123.txt”文件,图形用户界面实际上是被挂起/搜索,而不会查找文件 。

 

请注意, 通过cmd进行搜索是没有问题的:

 

图12:命令行下搜索文件

 

但是大多数人现在都使用Powershell,而使用Powershell又找不到这个文件,因为它会陷入无限循环:

 

图13:Powershell搜索

 

(输出被截断,因为命令总是循环打印这两个文件夹...)

 

搜索“123.txt”(例如“Get-ChildItem -Path C:\test -Filter 123.txt -Recurse -ErrorAction SilentlyContinue -Force”)将永远不会找到该文件(并且永远不会结束)。

 

我还用不同的AntiVirus产品进行了测试,这些产品似乎都可以正常工作(我将恶意软件样本放在这个...的特殊文件夹中,经过测试AntiVirus产品可以找到它们)。有些人仍然对这条路径感到困惑,例如在“C:\test\…\”中搜索病毒时,他们会在“C:\test\”中搜索。使用os.walk()的python代码似乎也能正常工作。

 

请注意,只是创建一个目录连接指向它自己的父文件夹不会在cmd或Powershell中导致无限循环 。

 

技巧4:“隐藏”目录连接的指向目标

 

目录连接是一个非常有用的NTFS功能,可以为攻击者找到安全漏洞。使用它可以创建(使用普通用户权限)到目标文件夹的符号链接。

 

解释目录连接的最佳安全漏洞是AVGater,攻击者将一个文件放在x文件夹中,然后将该文件标记为病毒,并且已安装的AntiVirus解决方案将其移至隔离区。之后攻击者删除文件夹x,并用一个名为“x”的目录连接替换它,该连接指向C:\windows\System32\。如果攻击者现在单击“恢复”按钮,AntiVirus解决方案会将把文件复制到x文件夹,该文件夹现在指向具有SYSTEM权限的system32(直接导致EoP)。

 

如果目标应用程序包含竞争条件类型漏洞(TOCTOU漏洞——检查使用时间),则目录连接会被滥用。

 

使用mklink实用程序和/J参数创建一个目录连接。可以将它与::$INDEX_ALLOCATION技巧结合使用,创建一个名为“…”的目录连接:

 

图14:创建目录连接

 

第一个目录连接“test1”是用一个普通的名称创建的,因此目标在“dir”输出中被正确地显示。但是,在“…”目录连接的情况下,不再显示目标(而是显示[…];见红框)。还请注意,你可以让连接点1指向连接点2,指向连接点3,以此类推,直到最后一个指向真正的目的地。

 

由于路径混淆,您可以使用上面提到的“cd…\…\”技巧(在system32文件夹中)进入结点,但 “.”会指向“C:\test8”:

 

图15:在...目录执行dir命令

 

dir命令从system32文件夹打印文件(红色标记请注意,第一个命令在C:\test8\创建了hello.bat文件)

 

图16:执行hello.bat结果

 

红色标记的文件是system32文件夹中的最后一个文件(dir命令的最后一个输出)。在蓝色中我们可以看到执行的是当前目录 (“.\”)中的“hello.bat” ,由于路径混淆,执行了C:\test8\hello.bat (绿色方块)而不是C:\windows\system32\hello.bat。我不确定这是否对安全性产生直接影响。因为我们可以在任何文件夹中启动文件。但是它可能会被用来绕过应用程序使用白名单脚本文件的白名单解决方案。




看雪ID:lipss  

bbs.pediy.com/user-214974


本文由看雪论坛 lipss 原创

转载请注明来自看雪社区



热门技术文章推荐:






戳原文,看看大家都是怎么说的?

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存